﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpPickInterface.h"
#include "ContainerUtil.h"
#include "IObject.h"

namespace gcmp {

    class IPick;
    class IGraphicsNodeReference;
    class IPick;

    /// \brief 拾取候选集
    ///
    /// 拾取候选集是一次拾取的结果。它包含0..n个拾取候选项。
    /// 例子:有两条重叠的模型线，鼠标移到模型线上时，将生成拾取候选集。此候选集包含两个拾取候选项。一个候选项为一条模型线。
    class GCMP_PICK_INTERFACE_EXPORT IPickResult : public IObject
    {
        DEFINE_CAST_DERIVED(IPickResult, IObject);
    public:

        /// \brief 创建空的拾取候选集
        /// \return OwnerPtr<IPickCandidates> 拾取候选集
        static OwnerPtr<IPickResult> Create();

        /// \brief 克隆拾取候选集
        /// \return 拾取候选集
        virtual OwnerPtr<IPickResult> Clone() const = 0;

        /// \brief 判断拾取候选集是否为空
        /// \return 返回true表示为空，返回false表示不为空
        virtual bool IsEmpty() const = 0;

        /// \brief 判断拾取候选集中拾取候选项的数量
        /// \return 拾取候选项的数量
        virtual int GetSize() const = 0;

        /// \brief 获得拾取候选集中所有的拾取候选项
        /// \return 拾取候选项
        virtual const std::vector<OwnerPtr<IPick>>& GetAllPicks() const = 0;

        /// \brief 获得拾取候选集中所有的拾取候选项
        /// \return 拾取候选项
        virtual std::vector<OwnerPtr<IPick>>& GetAllPicks() = 0;

        /// \brief 获得拾取候选集中最前面的一个图形节点的引用
        /// \return 图形节点引用指针
        virtual const gcmp::IGraphicsNodeReference* GetFront() const = 0;

        /// \brief 获得拾取候选集中所有的图形节点的引用
        /// \return 所有的图形节点的引用
        virtual std::vector<gcmp::OwnerPtr<gcmp::IGraphicsNodeReference>> GetAllGraphicsNodeReferences() const = 0;

        /// \brief 获得拾取候选集中所有被过滤掉的图形节点的引用
        /// \return 所有被过滤掉的图形节点的引用
        virtual const GraphicsNodeReferenceOwnerPtrVector& GetAllGraphicsNodeReferencesFiltered() const = 0;

        /// \brief 向拾取候选集中增加拾取候选项
        /// \param pickCandidate 增加的拾取候选项
        /// \return bool 增加成功返回true，失败返回false
        virtual bool AddPick(OwnerPtr<IPick> pickCandidate) = 0;    
    };

}// namespace gcmp

